http://elinux.org/Android_Portal
http://elinux.org/Android_Kernel_Features


stuff not upstream:
  - binder
  - ashmem
  - pmem
  - logger
  - wakelocks
  - oom notifications
  - alarm
  - paranoid network security
  - timed gpio


kernel trees:
	android.git.kernel.org
	>kernel/common.git
	>kernel/experimental.git  -> some experimental stuff
	>kernel/linux-2.6.git  -> supposed to be kernel tree used in android version
	>kernel/lk.git        -> not a kernel tree, but a bootloader
	>kernel/msm.git
	>kernel/omap.git  -> mirror of kernel tree maintained by texas instruments., supporting OMAP chips. usually based on kernel.org latest version, android products w OMAP chip can use this kernel port.
	>kernel/tegra.git  -> nvidia kernel tree 

6 kernel trees
  common
  	- 6 branches
	- .25, .27 (2), .29 (2), .32
  expermental
  	- 8 branches
	- .29, .30, .32 (3), .33 (3)
  msm
  	- 10 branches
	- .25(3), .27, .29 (4), .32(2)
  omap
  	- 3 branches
	- .29 (2), .32
  tegra
  	- 6 branches
	- .33 (3), .34(3)



platform/hardware/alsa_sound.git		ALSA based libaudio, audioflinger
platform/hardware/broadcom/wlan.git
platform/hardware/htc/dream.git
platform/hardware/libhardware.git		hardware abstraction library
platform/hardware/libhardware_legacy.git
platform/hardware/msm7k.git			msm7k hardware glue
platform/hardware/qcom/gps.git
platform/hardware/ril.git			radio interface layer
platform/hardware/ti/omap3.git
platform/hardware/ti/wlan.git


I love Android, really, I do.  A number of years ago, all of the major
phone manufacturers came to the Linux kernel and Xorg developer
community and asked us for help in creating a platform so that they
could use Linux on phones in a unified way.  Their major requirements
were:
	- good lowlevel hardware support
	- consistant userspace api for system libraries
	- royalty free Java

The Linux kernel has provided the first two things in spades.  Linux
supports more hardware devices than any other operating system ever has
in the history of computing, and it does so with a consistant user
interface, namely POSIX.

But it was that last item that we could not help out with.  Phone
manufacturers, like any company that ships an cost-sensitive device,
hate paying a per-device royalty.  And the companies realized that they
needed a "write-once-run-anywhere" type application interface if they
were going to expect people to be able to write applications for a wide
range of hardware platforms and device configurations with any chance of
success.

So the phone companies went off and created LiMO and other consortuim
groups, to try to nail down a binary-level application layer that tried
to resolve the issue that they did not have a free Java that they could
use, with the goal to try to solve the issue this way.  You all know how
well that all worked out...

Along comes Google with Android.  It consists of all of the above
requirements.  The Linux kernel at the bottom, providing a "run time
hardware abstraction layer" that makes it easy to change any hardware
for the system quite easily without having to worry about the rest of
the stack above.

And the stack above the kernel?  It's all a "free Java", providing the
wonderful api layer that developers can write to that enables
cross-device compatibility with little-to-no changes to applications to
ensure things work properly.

They gave the whole thing away "for free" so that other manufacturers
can use the platform, and it has been ported to a wide range of systems
as a result.

This is a wonderful thing, and I think Google has done an excellent
engieering task here.  I feel it's the future of mobile computing, and
strongly want to see it succeed.

So, given all of that, let's look in detail as to how Google went about
that lowest level of the layer, the kernel.  Hopefully by understanding
the parts that Google "got wrong" when it came to the kernel, will help
everyone understand how to deal with the community, and how to 



Things Google did right:

- picked the Linux kernel
- released all the code at android.git.kernel.org
- enforced the license of the kernel (gplv2)
- 


diffstat of .34-rc2 patch:

 283 files changed, 47715 insertions(+), 363 deletions(-)

driver stuff:
	148 files changed, 23160 insertions(+), 192 deletions(-)
fs stuff:
	 45 files changed, 15786 insertions(+), 15 deletions(-)
arch stuff:
	 64 files changed, 7266 insertions(+), 82 deletions(-)
core stuff:
	 26 files changed, 1503 insertions(+), 74 deletions(-)

50% driver
30% filesystem
15% arch
 5% core


drivers:
	dcc_tty - arm tty driver (2007)
	reset key driver (2008)
	gpio input drivers (2008)
	timed gpio driver (2008)
	synaptics i2c touchscreen driver (2007) (added multitouch in July 2009)
	ledtrig-sleep debug driver (2008)
	apanic debug flash driver (2009) writes panic info to flash to catch it later
	kernel debugger core (2008)
	pmem driver (2008)
	uid status (2009) collects per-user network statistics through a proc file
	Bluetooth TI wl127x rfkill power control via GPIO (2009)
	Loads of MMC changes (SDIO support, "paranoid mode, new host driver)
	nvidia Tegra MDT NAND controller (2008)
	RTC Alarm driver (2008)
	Logger (2008)
	ram console (2008)
	Switch subsystem? (2008)
	GPIO switch (2008)
	USB Gadget subsystem rewrite (2008)
	tegra USB gadget driver (2010)
	tegra framebuffer driver (2010)
	bluetooth fixes and extensions (2009)

Security model:
	Binder (2007)
	"secure" networking (2008)

filesystem:
	YAFFS2
	FAT Volume ID ioctl (2008)
	no inotify event under some situations
	Partition uevents (2009)
	special proc file type

networking:
	PPP on L2TP Access Controller (2009)
	PPP on PPTP Network server (2009)
	sysfs files for networking controls (2008)

core:
	low memory killer (2008)
	wakelocks (2008)
	"early" suspend (2008)
	ashmem (anonymous shared memory) (2008)
	panic timeout
	cgroup/cset changes (2009)
	futex speedup due to broken userspace code (2009)
	min_free_order_shift sysctl for swapless systems (2009)


disable /dev/mem
